<?php
/**
 * 预处理语句可以加快重复的查询的速度并且防止sql注入
 * 预处理语句如此有用，以至于在驱动程序不支持的时PDO 将模拟处理。这样可以确保不管数据库是否具有这样的功能，都可以确保应用程序可以用相同的数据访问模式
 */
	try {
		//生成一条预处理语句并且绑定参数，占位符以":"开头，必须占用整个值的位置
		$stmt = $dbh->prepare("INSERT INTO `test`.`foo` (`name`, `date`, `description`) VALUES (:name, :date, :description)");
		$stmt->bindParam(':name', $name);
		$stmt->bindParam(':date', $date);
		$stmt->bindParam(':description', $description);
		//$stmt->bindParam(':description', $description);//绑定参数
		//$stmt->bindValue(':description', "注释");//绑定值
		
		//另一种绑定方式
//		$stmt = $dbh->prepare("INSERT INTO `test`.`foo` (`name`, `date`, `description`) VALUES (?, ? ,?)");
//		$stmt->bindParam(1, $name);
//		$stmt->bindParam(2, $date);
//		$stmt->bindParam(3, $description);
//		
//		//插入一行数据
//		$name = 'stmt1';
//		$date = 1;
//		$description = '预处理语句1';
//		$stmt->execute();//执行
//		
//		$name = 'stmt2';
//		$date = 2;
//		$description = '预处理语句2';
//		$stmt->execute();
		
		//另一种插入方式
		$stmt = $dbh->prepare("INSERT INTO `test`.`foo` (`name`, `date`, `description`) VALUES (:name, :date, :description)");
		if ($stmt->execute(array("name"=>"stmt3","date"=>3,"description"=>"预处理语句3"))) {
			while ($row = $stmt->fetch()) {
			    print_r($row);
			}
		}
		//或者也能用数组的方式
//		$stmt = $dbh->prepare("INSERT INTO `test`.`foo` (`name`, `date`, `description`) VALUES (?, ? ,?)");
//		if ($stmt->execute(array("stmt3",3,"预处理语句3"))) {
//			while ($row = $stmt->fetch()) {
//			    print_r($row);
//			}
//		}

		//调用存储过程，以及绑定返回值
//		$stmt = $dbh->prepare("CALL sp_returns_string(?)");
//		$stmt->bindParam(1, $return_value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);
//		//bool bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )
//		//$return_value既会作为参数传递给存储过程，也会接收返回值
//		$stmt->execute();// 调用存储过程
//		print "procedure returned $return_value\n";
	}
	catch (Exception $e){
		echo "Failed: " . $e->getMessage();
	}
